﻿// LearnCpp.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//

#include <iostream>
#include<limits>
using namespace std;//告诉编译器使用 std 命名空间。命名空间是 C++ 中一个相对新的概念。

/*
    数据类型：https://www.runoob.com/cplusplus/cpp-data-types.html
*/


/*
块注释符是不可以嵌套使用的。

#if 0 ... #endif 属于条件编译，0 即为参数。

此外，我们还可以使用 #if 0 ... #endif 来实现注释，且可以实现嵌套，格式为：

#if 0
code
#endif 
你可以把 #if 0 改成 #if 1 来执行 code 的代码。

这种形式对程序调试也可以帮助，测试时使用 #if 1 来执行测试代码，发布后使用 #if 0 来屏蔽测试代码。

#if 后可以是任意的条件语句。

下面的代码如果 condition 条件为 true 执行 code1 ，否则执行 code2。

#if condition
code1
#else
code2
#endif
*/


/*
   https://www.runoob.com/cplusplus/cpp-basic-syntax.html
*/

int main()
{
    //std::cout << "Hello World!\n";
    cout << "Hello World!" << endl;//endl将在每一行后插入一个换行符
    cout << "hello world!\n";
#if 0
    printf("执行测试代码\n");
#else
    printf("执行了 else 条件语句");
    printf(" \n------------------------------------------------------------------------------\n");
#endif // 0

  


    /*
        基本的内置类型
        C++ 为程序员提供了种类丰富的内置数据类型和用户自定义的数据类型。下表列出了七种基本的 C++ 数据类型：

        类型	关键字
        布尔型	bool
        字符型	char
        整型	int
        浮点型	float
        双浮点型	double
        无类型	void
        宽字符型	
        wchar_t

        其实 wchar_t 是这样来的：

        typedef short int wchar_t;
        所以 wchar_t 实际上的空间是和 short int 一样。

        一些基本类型可以使用一个或多个类型修饰符进行修饰：

        signed
        unsigned
        short
        long

    */


    cout << "type: \t\t" << "************size**************" << endl;
    cout << "bool: \t\t" << "所占字节数：" << sizeof(bool);
    cout << "\t最大值：" << (numeric_limits<bool>::max)();
    cout << "\t\t最小值：" << (numeric_limits<bool>::min)() << endl;
    cout << "char: \t\t" << "所占字节数：" << sizeof(char);
    cout << "\t最大值：" << (numeric_limits<char>::max)();
    cout << "\t\t最小值：" << (numeric_limits<char>::min)() << endl;
    cout << "signed char: \t" << "所占字节数：" << sizeof(signed char);
    cout << "\t最大值：" << (numeric_limits<signed char>::max)();
    cout << "\t\t最小值：" << (numeric_limits<signed char>::min)() << endl;
    cout << "unsigned char: \t" << "所占字节数：" << sizeof(unsigned char);
    cout << "\t最大值：" << (numeric_limits<unsigned char>::max)();
    cout << "\t\t最小值：" << (numeric_limits<unsigned char>::min)() << endl;
    cout << "wchar_t: \t" << "所占字节数：" << sizeof(wchar_t);
    cout << "\t最大值：" << (numeric_limits<wchar_t>::max)();
    cout << "\t\t最小值：" << (numeric_limits<wchar_t>::min)() << endl;
    cout << "short: \t\t" << "所占字节数：" << sizeof(short);
    cout << "\t最大值：" << (numeric_limits<short>::max)();
    cout << "\t\t最小值：" << (numeric_limits<short>::min)() << endl;
    cout << "int: \t\t" << "所占字节数：" << sizeof(int);
    cout << "\t最大值：" << (numeric_limits<int>::max)();
    cout << "\t最小值：" << (numeric_limits<int>::min)() << endl;
    cout << "unsigned: \t" << "所占字节数：" << sizeof(unsigned);
    cout << "\t最大值：" << (numeric_limits<unsigned>::max)();
    cout << "\t最小值：" << (numeric_limits<unsigned>::min)() << endl;
    cout << "long: \t\t" << "所占字节数：" << sizeof(long);
    cout << "\t最大值：" << (numeric_limits<long>::max)();
    cout << "\t最小值：" << (numeric_limits<long>::min)() << endl;
    cout << "unsigned long: \t" << "所占字节数：" << sizeof(unsigned long);
    cout << "\t最大值：" << (numeric_limits<unsigned long>::max)();
    cout << "\t最小值：" << (numeric_limits<unsigned long>::min)() << endl;
    cout << "double: \t" << "所占字节数：" << sizeof(double);
    cout << "\t最大值：" << (numeric_limits<double>::max)();
    cout << "\t最小值：" << (numeric_limits<double>::min)() << endl;
    cout << "long double: \t" << "所占字节数：" << sizeof(long double);
    cout << "\t最大值：" << (numeric_limits<long double>::max)();
    cout << "\t最小值：" << (numeric_limits<long double>::min)() << endl;
    cout << "float: \t\t" << "所占字节数：" << sizeof(float);
    cout << "\t最大值：" << (numeric_limits<float>::max)();
    cout << "\t最小值：" << (numeric_limits<float>::min)() << endl;
    cout << "size_t: \t" << "所占字节数：" << sizeof(size_t);
    cout << "\t最大值：" << (numeric_limits<size_t>::max)();
    cout << "\t最小值：" << (numeric_limits<size_t>::min)() << endl;
    cout << "string: \t" << "所占字节数：" << sizeof(string) << endl;
    // << "\t最大值：" << (numeric_limits<string>::max)() << "\t最小值：" << (numeric_limits<string>::min)() << endl;  
    cout << "type: \t\t" << "************size**************" << endl;

    /*
        type:           ************size**************
        bool:           所占字节数：1   最大值：1               最小值：0
        char:           所占字节数：1   最大值：               最小值：€
        signed char:    所占字节数：1   最大值：               最小值：€
        unsigned char:  所占字节数：1   最大值：              最小值：
        wchar_t:        所占字节数：2   最大值：65535           最小值：0
        short:          所占字节数：2   最大值：32767           最小值：-32768
        int:            所占字节数：4   最大值：2147483647      最小值：-2147483648
        unsigned:       所占字节数：4   最大值：4294967295      最小值：0
        long:           所占字节数：4   最大值：2147483647      最小值：-2147483648
        unsigned long:  所占字节数：4   最大值：4294967295      最小值：0
        double:         所占字节数：8   最大值：1.79769e+308    最小值：2.22507e-308
        long double:    所占字节数：8   最大值：1.79769e+308    最小值：2.22507e-308
        float:          所占字节数：4   最大值：3.40282e+38     最小值：1.17549e-38
        size_t:         所占字节数：4   最大值：4294967295      最小值：0
        string:         所占字节数：28
        type:           ************size**************
    */

    //本实例使用了 endl，这将在每一行后插入一个换行符，<< 运算符用于向屏幕传多个值，sizeof() 函数用来获取各种数据类型的大小。


    /*
        typedef 声明
        您可以使用 typedef 为一个已有的类型取一个新的名字。下面是使用 typedef 定义一个新类型的语法：

        typedef type newname; 
    */
    typedef int number;
    number age = 20;
    number mobile = 100066;

    printf("age = %d , mobile = %d \n", age, mobile);
    //age = 20 , mobile = 100066


    /*
        枚举类型
        枚举类型(enumeration)是C++中的一种派生数据类型，它是由用户定义的若干枚举常量的集合。

        如果一个变量只有几种可能的值，可以定义为枚举(enumeration)类型。所谓"枚举"是指将变量的值一一列举出来，变量的值只能在列举出来的值的范围内。

        创建枚举，需要使用关键字 enum。枚举类型的一般形式为：

        enum 枚举名{ 
             标识符[=整型常数], 
             标识符[=整型常数], 
        ... 
            标识符[=整型常数]
        } 枚举变量;
    */

    enum color
    {
        red, green, blue
    }c;
    c = blue;
    //c = 2

    printf("c = %d \n", c);

    /*
        默认情况下，第一个名称的值为 0，第二个名称的值为 1，第三个名称的值为 2，以此类推。但是，您也可以给名称赋予一个特殊的值，只需要添加一个初始值即可。例如，在下面的枚举中，green 的值为 5
    */
    enum color2
    {
        red2, green2 = 5, blue2
    };

    printf("green2 = %d , blue2 = %d  \n", green2, blue2);
    //green2 = 5, blue2 = 6


    return 0;
}

// 运行程序: Ctrl + F5 或调试 >“开始执行(不调试)”菜单
// 调试程序: F5 或调试 >“开始调试”菜单

// 入门使用技巧: 
//   1. 使用解决方案资源管理器窗口添加/管理文件
//   2. 使用团队资源管理器窗口连接到源代码管理
//   3. 使用输出窗口查看生成输出和其他消息
//   4. 使用错误列表窗口查看错误
//   5. 转到“项目”>“添加新项”以创建新的代码文件，或转到“项目”>“添加现有项”以将现有代码文件添加到项目
//   6. 将来，若要再次打开此项目，请转到“文件”>“打开”>“项目”并选择 .sln 文件
